package com.wanshu.sys.controller;

import com.wanshu.common.annotation.SysLogger;
import com.wanshu.common.execption.BizException;
import com.wanshu.common.result.ResultWrapper;
import com.wanshu.sys.model.SysUserQueryDto;
import com.wanshu.common.util.PageUtils;
import com.wanshu.sys.entity.SysUser;
import com.wanshu.sys.model.res.roleMenuTree.UserRoleMenuRes;
import com.wanshu.sys.service.ISysUserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 系统用户 前端控制器
 * </p>
 *
 * @author 张颖辉（zyh）
 * @version 1.0.0
 * @date 2023/05/09
 */
@Api(tags = "系统用户", value = "SysUser")
/** 跨域问题：当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。
 * 前端代码中请求后端服务，发起一个新请求，如前端服务localhost:80的js中请求后端 localhost8080 的接口，浏览器为了安全会禁止访问，并提示跨域错误。
 * 注意：二级域名不同也算跨域，二级以下域名不同不算跨域。
 */
//@CrossOrigin  //放开跨域的解决方案之一， 整合springSecurity后，会使之失效。 用配置corsConfigurationSource()解决
@RestController
@RequestMapping("/sys/sysUser")
public class SysUserController {

    @Resource
    private ISysUserService userService;

    /**
     * 列表
     *
     * @return {@link List }<{@link SysUser }>
     * @author 张颖辉（zyh）
     * @date 2023/06/28
     * @version 1.0.0
     */
    @ApiOperation(value = "分页查询系统用户", notes = "分页查询系统内的用户信息")
    @GetMapping("list")
    public PageUtils<SysUser> list(SysUserQueryDto sysUserQueryDto) {
        return userService.queryPage(sysUserQueryDto);
    }

    /* 示例 Demo */
//    @ApiOperation(value = "查询系统用户", notes = "查询系统内的用户信息")
//    @GetMapping("list")
//    public List<SysUser> list() {
//        return userService.list();
//    }
//
//    @IgnoredResultWrapper //装饰不生效
//    @ApiOperation(value = "查询系统用户1-响应装饰不生效", notes = "查询系统内的用户信息-- 装饰不生效")
//    @GetMapping("list1")
//    public List<SysUser> list1() {
//        return userService.list();
//    }
//
//    @ApiOperation(value = "查询系统用户2-自定义响应装饰", notes = "查询系统内的用户信息-- 自定义响应装饰")
//    @GetMapping("list2")
//    public ResultWrapper list2() {
//        ResultWrapper resultWrapper = new ResultWrapper();
//        resultWrapper.setCode("201");
//        resultWrapper.setMessage("自定义响应装饰");
//        resultWrapper.setData(userService.list());
//        return resultWrapper;
//    }
//
    @ApiOperation(value = "查询系统用户3-异常示例", notes = "throw new BizException(\"901\", \"异常示例\");")
    @GetMapping("list3")
    public ResultWrapper list3() {
        ResultWrapper resultWrapper = new ResultWrapper();
        resultWrapper.setCode("201");
        resultWrapper.setMessage("自定义响应装饰");
        resultWrapper.setData(userService.list());
        if (true) {
            throw new BizException("901", "异常示例");
        }
        return resultWrapper;
    }

    /**
     * 其他用户是否已经有重复的名称
     * 是否存在用户名称，但不是当前的用户
     *
     * @param sysUser 用户
     * @return {@link Boolean }
     * @author 张颖辉（zyh）
     * @date 2023/06/28
     * @version 1.0.0
     */
    @ApiOperation(value = "用户名是否存在", notes = "用户名是否存在，存在返回true,不存在返回false")
    @PostMapping("existUserName")
    public Boolean existUserName(@RequestBody SysUser sysUser) {
        return userService.existUserName(sysUser);
    }

    /**
     * 添加 系统用户
     *
     * @param sysUser 系统用户
     * @return {@link Boolean }
     * @author 张颖辉（zyh）
     * @date 2023/06/30
     * @version 1.0.0
     */
    @ApiOperation(value = "新增系统用户", notes = "新增系统用户")
    @SysLogger("新增或修改系统用户") //测试controller中记录日志
    @PostMapping("save")
    public String save(@RequestBody SysUser sysUser) {
        userService.saveUser(sysUser);
        return "success";
    }

    /**
     * 通过id查询用户
     *
     * @param userId 用户id
     * @return {@link SysUser }
     * @author 张颖辉（zyh）
     * @date 2023/06/30
     * @version 1.0.0
     */
    @ApiOperation(value = "通过ID查用户信息",notes = "通过ID查用户信息")
    @PostMapping("queryUserById")
    public UserRoleMenuRes queryUserById(Long userId){
        return userService.queryUserById(userId);
    }
}
